const { DataTypes } = require('sequelize');
const { sequelize } = require('../library/sequelize');

// 定义note模型
const note = sequelize.define('note', {
    note_id: {
        type: DataTypes.INTEGER.UNSIGNED,
        primaryKey: true,
        autoIncrement: true,
        comment: '留言表主键ID'
    },
    identify_code: {
        type: DataTypes.STRING(255),
        allowNull: false,
        defaultValue: '',
        unique: true,
        comment: '唯一标识码'
    },
    user_id: {
        type: DataTypes.INTEGER.UNSIGNED,
        allowNull: false,
        defaultValue: 0,
        comment: '留言用户ID'
    },
    name_en: {
        type: DataTypes.STRING(255),
        allowNull: false,
        defaultValue: '',
        comment: '用户英文名称'
    },
    name_cn: {
        type: DataTypes.STRING(255),
        allowNull: false,
        defaultValue: '',
        comment: '用户中文名称'
    },
    note_type: {
        type: DataTypes.TINYINT.UNSIGNED,
        allowNull: false,
        defaultValue: 0,
        comment: '留言类型:0=其他,1=建议,2=BUG,3=投诉'
    },
    note_title: {
        type: DataTypes.STRING(255),
        allowNull: false,
        defaultValue: '',
        comment: '留言标题'
    },
    note_content: {
        type: DataTypes.TEXT,
        comment: '留言内容'
    },
    note_images: {
        type: DataTypes.TEXT,
        comment: '留言图片'
    },
    note_status: {
        type: DataTypes.TINYINT.UNSIGNED,
        allowNull: false,
        defaultValue: 0,
        comment: '留言状态:0=待处理,1=处理中,2=已处理,3=已关闭'
    },
    note_level: {
        type: DataTypes.TINYINT.UNSIGNED,
        allowNull: false,
        defaultValue: 0,
        comment: '留言等级:0=普通,1=重要,2=紧急'
    },
    user_ip: {
        type: DataTypes.STRING(64),
        allowNull: false,
        defaultValue: '',
        comment: '留言IP'
    },
    user_agent: {
        type: DataTypes.STRING(500),
        allowNull: false,
        defaultValue: '',
        comment: '用户设备信息'
    },
    respond_user_id: {
        type: DataTypes.INTEGER.UNSIGNED,
        allowNull: false,
        defaultValue: 0,
        comment: '回复用户ID'
    },
    respond_content: {
        type: DataTypes.TEXT,
        comment: '回复内容'
    },
    respond_time: {
        type: DataTypes.INTEGER.UNSIGNED,
        allowNull: false,
        defaultValue: 0,
        comment: '回复时间'
    },
    is_anonymous: {
        type: DataTypes.TINYINT,
        allowNull: false,
        defaultValue: 0,
        comment: '是否匿名:0公开 1匿名'
    },
    mobilephone: {
        type: DataTypes.STRING(255),
        allowNull: false,
        defaultValue: '',
        comment: '用户电话'
    },
    is_formal: {
        type: DataTypes.TINYINT.UNSIGNED,
        allowNull: false,
        defaultValue: 0,
        comment: '是否正式:0=测试,1=正式'
    },
    is_delete: {
        type: DataTypes.TINYINT.UNSIGNED,
        allowNull: false,
        defaultValue: 0,
        comment: '是否删除:0=正常,1=已删除'
    },
    create_time: {
        type: DataTypes.INTEGER.UNSIGNED,
        allowNull: false,
        defaultValue: 0,
        comment: '创建时间'
    },
    update_time: {
        type: DataTypes.INTEGER.UNSIGNED,
        allowNull: false,
        defaultValue: 0,
        comment: '更新时间'
    }
}, {
    tableName: 'ly_note',
    timestamps: false,
    comment: '用户留言反馈管理表'
});

// 获取创建默认值
const getCreateDefaults = () => {
    return {
        identify_code: generateIdentifyCode(),
        user_id: 0,
        name_en: '',
        name_cn: '',
        note_type: 0,
        note_title: '',
        note_content: '',
        note_images: '',
        note_status: 0,
        note_level: 0,
        user_ip: '',
        user_agent: '',
        respond_user_id: 0,
        respond_content: '',
        respond_time: 0,
        is_anonymous: 0,
        mobilephone: '',
        is_formal: 0,
        is_delete: 0,
        create_time: Math.floor(Date.now() / 1000),
        update_time: Math.floor(Date.now() / 1000)
    };
};

// 获取更新默认值
const getUpdateDefaults = () => {
    return {
        update_time: Math.floor(Date.now() / 1000)
    };
};

// 生成唯一标识码
const generateIdentifyCode = () => {
    const timestamp = Date.now().toString(36);
    const random = Math.random().toString(36).substr(2, 5);
    return `note_${timestamp}_${random}`;
};

// 留言类型枚举
const NOTE_TYPE = {
    OTHER: 0,    // 其他
    SUGGESTION: 1, // 建议
    BUG: 2,      // BUG
    COMPLAINT: 3  // 投诉
};

// 留言状态枚举
const NOTE_STATUS = {
    PENDING: 0,    // 待处理
    PROCESSING: 1, // 处理中
    PROCESSED: 2,  // 已处理
    CLOSED: 3      // 已关闭
};

// 留言等级枚举
const NOTE_LEVEL = {
    NORMAL: 0,   // 普通
    IMPORTANT: 1, // 重要
    URGENT: 2     // 紧急
};

// 匿名状态枚举
const ANONYMOUS_STATUS = {
    PUBLIC: 0,   // 公开
    ANONYMOUS: 1 // 匿名
};

// 初始化模型
const initModel = async () => {
    try {
        // 先尝试不修改表结构，只同步模型
        await note.sync({ force: false });
        console.log('✅ Note模型初始化成功');
        return true;
    } catch (error) {
        console.error('❌ Note模型初始化失败:', error);
        // 如果失败，尝试强制同步（会删除表重建）
        try {
            console.log('🔄 尝试强制同步表结构...');
            await note.sync({ force: true });
            console.log('✅ Note模型强制同步成功');
            return true;
        } catch (forceError) {
            console.error('❌ Note模型强制同步也失败:', forceError);
            return false;
        }
    }
};

module.exports = {
    note,
    getCreateDefaults,
    getUpdateDefaults,
    NOTE_TYPE,
    NOTE_STATUS,
    NOTE_LEVEL,
    ANONYMOUS_STATUS,
    initModel
};
